`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2017/11/02 14:52:16
// Design Name: 
// Module Name: alu
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module alu(
	input wire[31:0] a,b,
	input wire[4:0] c,  //sa instr[10:6]
	input wire[7:0] op,
	output wire[31:0] y,
	output wire overflow, //reg
	output wire zero
    );

    wire[31:0] goltic;  //逻辑运算结果
    reg[5:0] star;     //0位表示的是逻辑运算单元是否运行
    wire[31:0] shiftt;   //shift_ans;
    logict lo(a,b,star[0],op[3:0],goltic);  //逻辑运算单元
    shift shif(a,b,c,star[1],op[3:0],shiftt);
    always @(*) begin
        case(op[7:4])
            4'b0001: star<=000001;
            4'b0010: star<=000010;
            default: star<=000000;
        endcase
    end
    assign y=star[0]? goltic:
                      star[1]? shiftt:32'b0;
    assign zero = (y==32'b0);
    assign overflow = 1'b0;
    
//	wire[31:0] s,bout;
//	assign bout = op[2] ? ~b : b;
//	assign s = a + bout + op[2];
//	always @(*) begin
//		case (op[1:0])
//			2'b00: y <= a & bout;
//			2'b01: y <= a | bout;
//			2'b10: y <= s;
//			2'b11: y <= s[31];
//			default : y <= 32'b0;
//		endcase	
//	end
//	assign zero = (y == 32'b0);

//	always @(*) begin
//		case (op[2:1])
//			2'b01:overflow <= a[31] & b[31] & ~s[31] |
//							~a[31] & ~b[31] & s[31];
//			2'b11:overflow <= ~a[31] & b[31] & s[31] |
//							a[31] & ~b[31] & ~s[31];
//			default : overflow <= 1'b0;
//		endcase	
//	end
endmodule


